﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Espam.Idiomas.Decimo.Tesis.Datos;
using System.Data;
using System.Data.SqlClient;

namespace Espam.Idiomas.Decimo.Tesis.Negocio
{
   public class Modulos:Horarios
    {
       //public int ciclo             {get;set;}
       public DateTime fechaInicio    {get;set;}
       public DateTime  fechaFin      {get;set;}
       //public int nivel             {get;set;}
       public string paralelo       {get;set;}
       public string tipoModulo     {get;set;}
       public string codigoModulo   {get;set;}
       //public int idUbicacion       {get;set;}
       //public int idDocente         {get;set;}
       public string descripcionNivel { get; set; }
       //public int idHorario { get; set; }
       public string codigo { get; set; }
       public string ubicacion { get; set; }
       public string docente { get; set; }
       //public string horario { get; set; }
       public int idModulo { get; set; }
       public int idTipoModulo { get; set; }
       public int idAdmin { get; set; }
       public int idAlumno { get; set; }
       public int cupos { get; set; }
       public string estadoModuloMatricula { get; set; }
       public string patchLibro { get; set; }
       public string libro { get; set; }
       public string unidades { get; set; }
       public string numeroMatricula { get; set; }
       public string fechaInicio1 { get; set; }
       public string fechaFin1 { get; set; }
       public int idFechaModulos { get; set; }
       public int idHorarioDisponibilidad { get; set; }
       public int tag { get; set; }
       public int matriculados { get; set; }

       public string CrearModulo()
       {
           string mensaje="";
           SqlDataReader reader;
           BaseDatos oBase =  new BaseDatos();
           try
           {
               oBase.Conectar();
               string consulta = string.Format("sp_CrearModulo");
               SqlCommand comando = new SqlCommand(consulta, oBase.conexion);
               comando.CommandType = CommandType.StoredProcedure;
               comando.Parameters.AddWithValue("ciclo", ciclo);
               comando.Parameters.AddWithValue("fechaInicio", fechaInicio);
               comando.Parameters.AddWithValue("fechaFin", fechaFin);
               comando.Parameters.AddWithValue("nivel", nivel);
               comando.Parameters.AddWithValue("paralelo", paralelo);
               comando.Parameters.AddWithValue("idHorario", idHorario);
               comando.Parameters.AddWithValue("tipoModulo", tipoModulo);
               comando.Parameters.AddWithValue("codigoModule", codigoModulo);
               comando.Parameters.AddWithValue("idUbicacion", idUbicacion);
               comando.Parameters.AddWithValue("idDocente", idDocente);
               comando.Parameters.AddWithValue("idAdmin",idAdmin);
               reader = comando.ExecuteReader();
               while (reader.Read())
               {
                   mensaje = reader.GetString(0);                   
               }
           }
           catch (Exception ex)
           {
               mensaje = ex.Message;

           }
           finally
           {
               oBase.CerrarConexion();
           }
          return mensaje;
       }

       public List<Modulos> getModulosGuardadosPorHorario(int idHorario)
       {
           List<Modulos> listaModulos = new List<Modulos>();
           SqlDataReader reader;
           BaseDatos oBase = new BaseDatos();
           try
           {
               string consulta = string.Format("sp_getModulosPorHorario");
               SqlCommand comando = new SqlCommand(consulta, oBase.conexion);
               comando.CommandType = CommandType.StoredProcedure;
               SqlParameter parametro = new SqlParameter();
               parametro.ParameterName = "idHorario";
               parametro.Value = idHorario;
               comando.Parameters.Add(parametro);
               oBase.Conectar();
               reader = comando.ExecuteReader();
               while (reader.Read())
               {
                   Modulos oModulo = new Modulos();
                   oModulo.codigoModulo = reader.GetString(0);
                   oModulo.ubicacion = reader.GetString(1);
                   oModulo.docente = reader.GetString(2);
                   listaModulos.Add(oModulo);
               }
               return listaModulos;
           }
           catch (Exception)
           {

               throw;
           }
           finally
           {
               oBase.CerrarConexion();
           }
       }

       public List<Modulos> getHorariosAndModulos()
       {
           List<Modulos> lista = new List<Modulos>();
           SqlDataReader reader;
           BaseDatos oBase = new BaseDatos();
           try
           {
               string consulta = string.Format("sp_getModulosAndHorarios");
               SqlCommand comando = new SqlCommand(consulta, oBase.conexion);
               comando.CommandType = CommandType.StoredProcedure;
               oBase.Conectar();
               reader = comando.ExecuteReader();
               while (reader.Read())
               {
                   Modulos oModulo = new Modulos();
                   oModulo.idModulo = reader.GetInt32(0);
                   oModulo.horario = reader.GetString(1);
                   oModulo.codigo = reader.GetString(2);
                   oModulo.ubicacion = reader.GetString(3);
                   oModulo.docente = reader.GetString(4);
                   oModulo.cupos = reader.GetInt32(5);
                   oModulo.matriculados = reader.GetInt32(6);

                   lista.Add(oModulo);
               }
               return lista;

           }
           catch (Exception)
           {

               throw;
           }
           finally
           {
               oBase.CerrarConexion();
           }
          
       }

       public List<Modulos> editModulo()
       {
           List<Modulos> lista = new List<Modulos>();
           SqlDataReader reader;
           BaseDatos oBase = new BaseDatos();

           try
           {
               string consulta = string.Format("sp_getModuloByIdModulo");
               SqlCommand comando = new SqlCommand(consulta, oBase.conexion);
               comando.CommandType = CommandType.StoredProcedure;
               SqlParameter parametro = new SqlParameter();
               parametro.ParameterName = "idModulo";
               parametro.Value = idModulo;
               comando.Parameters.Add(parametro);
               oBase.Conectar();
               reader = comando.ExecuteReader();
               while (reader.Read())
               {
                   Modulos om = new Modulos();
                   om.idModulo = reader.GetInt32(0);
                   om.ciclo = reader.GetInt32(1);
                   om.codigo = reader.GetString(2);
                   om.fechaInicio = reader.GetDateTime(3);
                   om.fechaFin = reader.GetDateTime(4);
                   om.idHorario = reader.GetInt32(5);
                   om.idDocente = reader.GetInt32(6);
                   om.idUbicacion = reader.GetInt32(7);
                   om.idTipoModulo = reader.GetInt32(8);
                   om.ubicacion = reader.GetString(9);
                   lista.Add(om);
               }
               return lista;

           }
           catch (Exception)
           {

               throw;
           }
           finally
           {
               oBase.CerrarConexion();
           }
       }

       public string EditarModulos()
       {
           string mensaje = "";
           SqlDataReader reader;
           BaseDatos oBase = new BaseDatos();
           try
           {
               string consulta;
               consulta = string.Format("sp_editModulo");
               SqlCommand comando = new SqlCommand(consulta, oBase.conexion);
               comando.CommandType = CommandType.StoredProcedure;
               comando.Parameters.AddWithValue("nivel", nivel);
               comando.Parameters.AddWithValue("paralelo", paralelo);
               comando.Parameters.AddWithValue("idHorario", idHorario);
               comando.Parameters.AddWithValue("tipoModulo", tipoModulo);
               comando.Parameters.AddWithValue("codigoModule", codigoModulo);
               comando.Parameters.AddWithValue("idDocente", idDocente);
               comando.Parameters.AddWithValue("idUbicacion", idUbicacion);
               comando.Parameters.AddWithValue("idModulo",idModulo);
               oBase.Conectar();
               reader = comando.ExecuteReader();
               while (reader.Read())
               {
                   Modulos oM = new Modulos();
                   mensaje = reader.GetString(0);
               }

           }
           catch (Exception ex)
           {

               mensaje = ex.Message;
           }
           finally
           {
               oBase.CerrarConexion();
               
           }
           return mensaje;
       }

       public string DeleteModule()
       {
           string mensaje = "";
           SqlDataReader reader;
           BaseDatos oBase = new BaseDatos();
           try
           {
               string consulta = string.Format("sp_deleteModule");
               SqlCommand comando = new SqlCommand(consulta, oBase.conexion);
               comando.CommandType = CommandType.StoredProcedure;
               comando.Parameters.AddWithValue("idModulo", idModulo);
               oBase.Conectar();
               reader = comando.ExecuteReader();
               while (reader.Read())
               {
                   mensaje = reader.GetString(0);
               }

           }
           catch (Exception ex)
           {

               mensaje = ex.Message;
           }
           finally
           {
               oBase.CerrarConexion();
           }
           return mensaje;

       }

       public int ConsultarModulos()
       { 
           int valor=0;
           BaseDatos oBase = new BaseDatos();
           SqlDataReader reader;
           try
           {
               string consulta = string.Format("sp_consultaModulo");
               SqlCommand comando = new SqlCommand();
               comando.CommandText = consulta;
               comando.Connection = oBase.conexion;
               comando.CommandType = CommandType.StoredProcedure;
               comando.Parameters.AddWithValue("@codigo", codigoModulo);
               comando.Parameters.AddWithValue("@ciclo", ciclo);
               comando.Parameters.AddWithValue("@nivel", nivel);
               comando.Parameters.AddWithValue("@paralelo", paralelo);
               comando.Parameters.AddWithValue("@tipoModulo", tipoModulo);
               oBase.Conectar();
               reader = comando.ExecuteReader();
               while (reader.Read())
               {
                   valor = reader.GetInt32(0);
               }
              
           }
                 
           catch (Exception)
           {

               throw;
           }
           finally
           {
               oBase.CerrarConexion();
           }
           return valor;
       }

       public List<Modulos> getModulosByNivel()
       {
           List<Modulos> lista = new List<Modulos>();
           SqlDataReader reader;
           BaseDatos oBase = new BaseDatos();
           try
           {
               string consulta = string.Format("sp_getModuloByNivel");
               SqlCommand comando = new SqlCommand(consulta, oBase.conexion);
               comando.CommandType = CommandType.StoredProcedure;
               comando.Parameters.AddWithValue("nivel",nivel);
               comando.Parameters.AddWithValue("ciclo", ciclo);
               comando.Parameters.AddWithValue("tag",tag);
               comando.Parameters.AddWithValue("@idTipoModulo", idTipoModulo);
               oBase.Conectar();
               reader = comando.ExecuteReader();
               while (reader.Read())
               {
                   Modulos oModulo = new Modulos();
                   oModulo.idModulo = reader.GetInt32(0);
                   oModulo.horario = reader.GetString(1);
                   oModulo.codigo = reader.GetString(2);
                   oModulo.ubicacion = reader.GetString(3);
                   oModulo.docente = reader.GetString(4);
                   oModulo.cupos = reader.GetInt32(5);
                   lista.Add(oModulo);
               }
               return lista;

           }
           catch (Exception)
           {

               throw;
           }
           finally
           {
               oBase.CerrarConexion();
           }

       }

       public List<Modulos> getIdModulosForPublish()
       {
           BaseDatos oBase = new BaseDatos();
           SqlDataReader reader;
           List<Modulos> lista = new List<Modulos>();
           try
           {
               string consulta = string.Format("sp_getIdModulesByPublish");
               SqlCommand comando = new SqlCommand(consulta, oBase.conexion);
               comando.CommandType = CommandType.StoredProcedure;
               comando.Parameters.AddWithValue("ciclo", ciclo);
               comando.Parameters.AddWithValue("nivel", nivel);
               comando.Parameters.AddWithValue("@idTipoModulos", idTipoModulo);
               oBase.Conectar();
               reader = comando.ExecuteReader();
               while (reader.Read())
               {
                   Modulos oModulos = new Modulos();
                   oModulos.idModulo = reader.GetInt32(0);
                   lista.Add(oModulos);
               }
           }
           catch (Exception)
           {

               throw;
           }
           finally
           { 
               oBase.CerrarConexion();
           }
           return lista;
       }

       public string PublicarModulos()
       {
           string mensaje = "";
           BaseDatos oBase = new BaseDatos();
           SqlDataReader reader;
           List<Modulos> lista = new List<Modulos>();
           try
           {
              
               lista = getIdModulosForPublish();
               for (int i = 0; i < lista.Count; i++)
               {
                   string consulta = string.Format("sp_publicarModulo");
                   SqlCommand comando = new SqlCommand(consulta, oBase.conexion);
                   comando.CommandType = CommandType.StoredProcedure;
                   comando.Parameters.AddWithValue("@idAdmin", idAdmin);
                   comando.Parameters.AddWithValue("@idModulo", lista[i].idModulo);

                   comando.Parameters.AddWithValue("@fechaInicio", fechaInicio);
                   comando.Parameters.AddWithValue("@fechaFin", fechaFin);
                   comando.Parameters.AddWithValue("@horaInicio", horaInicio);
                   comando.Parameters.AddWithValue("@horaFin", horaFin);
                   comando.Parameters.AddWithValue("@idNivel",nivel);
                   comando.Parameters.AddWithValue("@idCiclo",ciclo);
                   comando.Parameters.AddWithValue("@cupo",cupos);
                   oBase.Conectar();
                   reader= comando.ExecuteReader();
                   while (reader.Read())
                   {
                       mensaje = reader.GetString(0);
                   }
                   oBase.CerrarConexion();

               }
           }
           catch (Exception ex)
           {
               mensaje = ex.Message;
           }
           finally
           {
               oBase.CerrarConexion();
           }
           return mensaje;
       }

       public List<Modulos> comprueba()
       {
           BaseDatos oBase = new BaseDatos();
           SqlDataReader reader;
           List<Modulos> lista = new List<Modulos>();
           try
           {
               string consulta = string.Format("sp_getDisponibilidadModuloByAlumno");
               SqlCommand comando = new SqlCommand(consulta, oBase.conexion);
               comando.CommandType = CommandType.StoredProcedure;
               comando.Parameters.AddWithValue("@nivel", nivel);
               comando.Parameters.AddWithValue("@fechaIni", fechaInicio);
               comando.Parameters.AddWithValue("@fechaFin", fechaFin);
               comando.Parameters.AddWithValue("@horaIni", horaInicio);
               comando.Parameters.AddWithValue("@horaFin", horaFin);
               oBase.Conectar();
               reader = comando.ExecuteReader();
               while (reader.Read())
               {
                   Modulos oM = new Modulos();
                   oM.idHorario = reader.GetInt32(0);
                   oM.horario = reader.GetString(1);
                   oM.idModulo = reader.GetInt32(2);
                   lista.Add(oM);
               }
           }
           catch (Exception )
           {
           }
           finally
           {
               oBase.CerrarConexion();
           }
           return lista;
       }

       

       public List<Modulos> CompruebaNivel()
       {

           BaseDatos oBase = new BaseDatos();
           SqlDataReader reader;
           List<Modulos> lista = new List<Modulos>();
           try
           {
               string consulta = string.Format("sp_getLastLevelAprovedById");
               SqlCommand comando = new SqlCommand(consulta, oBase.conexion);
               comando.CommandType = CommandType.StoredProcedure;
               comando.Parameters.AddWithValue("idAlumno", idAlumno);
               oBase.Conectar();
               reader = comando.ExecuteReader();
               while (reader.Read())
               {
                   Modulos omo = new Modulos();
                   omo.nivel = reader.GetInt32(0);
                   omo.descripcionNivel = reader.GetString(1);
                   omo.idModulo = reader.GetInt32(2);
                   omo.horario = reader.GetString(3);
                   omo.estadoModuloMatricula = reader.GetString(4);
                   omo.fechaInicio = reader.GetDateTime(5);
                   omo.fechaFin = reader.GetDateTime(6);
                   omo.ubicacion = reader.GetString(7);
                   omo.libro = reader.GetString(8);
                   omo.patchLibro = reader.GetString(9);
                   omo.unidades = reader.GetString(10);
                   omo.numeroMatricula = reader.GetString(11);
                   lista.Add(omo);
               }
           }
           catch (Exception)
           {
           }
           finally
           {
               oBase.CerrarConexion();
           }
           return lista;
       }

       public string CompruebaIfExisteModuloByHorarioAndDocente()
       {
           string mensaje = "";
           SqlDataReader reader;
           BaseDatos oBase = new BaseDatos();
           try
           {
               oBase.Conectar();
               string consulta = string.Format("sp_ConsultaModuloHorario");
               SqlCommand comando = new SqlCommand(consulta, oBase.conexion);
               comando.CommandType = CommandType.StoredProcedure;
               comando.Parameters.AddWithValue("ciclo", ciclo);
               comando.Parameters.AddWithValue("idDocente", idDocente);
               comando.Parameters.AddWithValue("idHorario", idHorario);
               comando.Parameters.AddWithValue("tipo", tipoModulo);
               reader = comando.ExecuteReader();
               while (reader.Read())
               {
                   mensaje = reader.GetString(0);
               }
           }
           catch (Exception ex)
           {
               mensaje = ex.Message;

           }
           finally
           {
               oBase.CerrarConexion();
           }
           return mensaje;
       }

       public List<Modulos> GetListaNivelesDisponibles()
       {
           BaseDatos oBase = new BaseDatos();
           SqlDataReader reader;
           List<Modulos> lista = new List<Modulos>();
           try
           {
               string consulta = string.Format("sp_ConsultMatriculaOrNiveles");
               SqlCommand comando = new SqlCommand(consulta, oBase.conexion);
               comando.CommandType = CommandType.StoredProcedure;
               comando.Parameters.AddWithValue("@fechaIni", fechaInicio);
               comando.Parameters.AddWithValue("@fechaFin", fechaFin);
               comando.Parameters.AddWithValue("@horaIni", horaInicio);
               comando.Parameters.AddWithValue("@horaFin", horaFin);
               comando.Parameters.AddWithValue("idAlumno", idAlumno);
               oBase.Conectar();
               reader = comando.ExecuteReader();
               while (reader.Read())
               {
                   Modulos omo = new Modulos();
                   omo.nivel = reader.GetInt32(0);
                   omo.descripcionNivel = reader.GetString(1);
                   omo.idModulo = reader.GetInt32(2);
                   omo.horario = reader.GetString(3);
                   omo.estadoModuloMatricula = reader.GetString(4);
                   omo.fechaInicio = reader.GetDateTime(5);
                   omo.fechaFin = reader.GetDateTime(6);
                   omo.ubicacion = reader.GetString(7);
                   omo.libro = reader.GetString(8);
                   omo.patchLibro = reader.GetString(9);
                   omo.unidades = reader.GetString(10);
                   omo.numeroMatricula = reader.GetString(11);
                   lista.Add(omo);
               }
           }
           catch (Exception)
           {
           }
           finally
           {
               oBase.CerrarConexion();
           }
           return lista;
       }

       public List<Modulos> GetModulosPublicados()
       {
           List<Modulos> lista = new List<Modulos>();
           BaseDatos oBase = new BaseDatos();
           SqlDataReader reader;
           try
           {
               string consulta = string.Format("sp_getDatosEditPublish");
               SqlCommand comando = new SqlCommand(consulta, oBase.conexion);
               comando.CommandType = CommandType.StoredProcedure;
               comando.Parameters.AddWithValue("ciclo", ciclo);
               comando.Parameters.AddWithValue("nivel", nivel);
               comando.Parameters.AddWithValue("@idTipoModulo",idTipoModulo);
               oBase.Conectar();
               reader = comando.ExecuteReader();
               while (reader.Read())
               {
                   Modulos oMo = new Modulos();
                   oMo.idFechaModulos = reader.GetInt32(0);
                   oMo.idHorarioDisponibilidad = reader.GetInt32(1);
                   oMo.cupos = reader.GetInt32(2);
                   oMo.fechaInicio1 = reader.GetString(3);
                   oMo.fechaFin1 = reader.GetString(4);
                   oMo.horaInicio1 = reader.GetTimeSpan(5);
                   oMo.horaFin1 = reader.GetTimeSpan(6);
                   lista.Add(oMo);
               }
           }
           catch (Exception)
           {
               lista = null;
           }
           finally
           {
               oBase.CerrarConexion();
           }
           return lista;
       }

       public string EditHoarioYFechaPublicacion()
       {
           string mensaje = "";
           SqlDataReader reader;
           BaseDatos oBase = new BaseDatos();
           try
           {
               string consulta = string.Format("sp_updateFechaYHoraPublicacion");
               SqlCommand comando = new SqlCommand(consulta,oBase.conexion);
               comando.CommandType = CommandType.StoredProcedure;
               comando.Parameters.AddWithValue("@idFecha",idFechaModulos);
               comando.Parameters.AddWithValue("@idHora", idHorarioDisponibilidad);
               comando.Parameters.AddWithValue("@fechaInicio", fechaInicio);
               comando.Parameters.AddWithValue("@fechaFin", fechaFin);
               comando.Parameters.AddWithValue("@horaInicio", horaInicio1);
               comando.Parameters.AddWithValue("@horaFin", horaFin1);
               comando.Parameters.AddWithValue("@ciclo", ciclo);
               comando.Parameters.AddWithValue("@nivel", nivel);
               oBase.Conectar();
               reader = comando.ExecuteReader();
               while (reader.Read())
               {
                   mensaje = reader.GetString(0);
               }
               
           }
           catch (Exception)
           {

               throw;
           }
           finally
           {
               oBase.CerrarConexion();
           }
           return mensaje;
       }

       public List<Modulos> GetHorariosByRegisterLocal()
       {
           BaseDatos oBase = new BaseDatos();
           List<Modulos> lista = new List<Modulos>();
           SqlDataReader reader;
           try
           {
               SqlCommand comando = new SqlCommand("sp_getNivelesByRegister", oBase.conexion);
               comando.CommandType = CommandType.StoredProcedure;
               comando.Parameters.AddWithValue("nivel", nivel);
               oBase.Conectar();
               reader = comando.ExecuteReader();
               while (reader.Read())
               {
                   Modulos oHora = new Modulos();
                   oHora.idHorario = reader.GetInt32(0);
                   oHora.horario = reader.GetString(1);
                   oHora.idModulo = reader.GetInt32(2);
                   lista.Add(oHora);
               }
           }
           catch (Exception)
           {
               lista = null;
           }
           finally
           {
               oBase.CerrarConexion();
           }
           return lista;
       }

       public List<Modulos> GetHorariosByRegisterExonerados()
       {
           BaseDatos oBase = new BaseDatos();
           List<Modulos> lista = new List<Modulos>();
           SqlDataReader reader;
           try
           {
               SqlCommand comando = new SqlCommand("sp_getHorarioByNivelAndCicloRegisterAntiguos", oBase.conexion);
               comando.CommandType = CommandType.StoredProcedure;
               comando.Parameters.AddWithValue("nivel", nivel);
               comando.Parameters.AddWithValue("ciclo",ciclo);
               oBase.Conectar();
               reader = comando.ExecuteReader();
               while (reader.Read())
               {
                   Modulos oHora = new Modulos();
                   oHora.idModulo = reader.GetInt32(0);
                   oHora.horario = reader.GetString(1);
                   lista.Add(oHora);
               }
           }
           catch (Exception)
           {
               lista = null;
           }
           finally
           {
               oBase.CerrarConexion();
           }
           return lista;
       }

       public List<Modulos> GetEstadosModulos()
       {
           BaseDatos oBase = new BaseDatos();
           List<Modulos> lista = new List<Modulos>();
           SqlDataReader reader;
           try
           {
               SqlCommand comando = new SqlCommand("sp_getEstadosModulos", oBase.conexion);
               comando.CommandType = CommandType.StoredProcedure;
               oBase.Conectar();
               reader = comando.ExecuteReader();
               while (reader.Read())
               {
                   Modulos oM = new Modulos();
                   oM.idEstado = reader.GetInt32(0);
                   oM.estadoModuloMatricula = reader.GetString(1);
                   lista.Add(oM);
               }
           }
           catch (Exception)
           {
               lista = null;
           }
           finally
           {
               oBase.CerrarConexion();
           }
           return lista;

       }

       public string UpdateCupos()
       { 
            BaseDatos oB = new BaseDatos();
            SqlDataReader reader;
           string mensaje="";
            try
            {
                SqlCommand comando = new SqlCommand("sp_updateCupos", oB.conexion);
            comando.CommandType = CommandType.StoredProcedure;
            comando.Parameters.AddWithValue("@idModulo",idModulo);
            comando.Parameters.AddWithValue("@cupos",cupos);
            oB.Conectar();
            reader = comando.ExecuteReader();
            while (reader.Read())
            {
                mensaje = reader.GetString(0);
            }
            }
            catch (Exception)
            {
                
            }
           finally
            {
                oB.CerrarConexion();
            }
           return mensaje;

       }
    }
}
